其他
从三道题目入门frida
本文为看雪论坛优秀文章
看雪论坛作者ID:小白abc
本文为看雪安卓高研2w班(6月班)优秀学员作品。
题目来自2w班6月习题,题目本身都没有加壳没有混淆,主要逻辑就是输入flag,程序本身利用hash加密后与程序已有密文进行对比,细节方面略有不同,但大体来说就是爆破,整个过程逻辑很清晰,都不难,基本上都是Frida一把梭。
题目主要考察了以下知识点:
1. frida java hook与静态函数的主动调用
2. Frida遍历ClassLoader从而hook动态加载的dex的函数
3. frida native hook去反调试
ps. 题目附件请点击“阅读原文”下载。
现在,看雪《安卓高级研修班(网课)》9月班开始招生啦!点击查看详情报名吧~
第一题
程序分析
1. 输入长度为5位
2. frida hook这个函数直接强制返回true就行,这个check就这样pass了,但是拿不到正确的flag
1. Frida
Java.perform(function(){
Java.use('com.kanxue.pediy1.VVVVV').VVVV.implementation = function(listener,input){
console.log('input= ',input);
for (var i = '0'; i <= '9'; i++) {
//System.out.println(i);
for (var j = '0'; j <= '9'; j++) {
for (var k = '0'; k <= '9'; k++) {
for (var t = '0'; t <= '9'; t++) {
for (var y = '0'; y <= '9'; y++) {
var newInput = Java.use('java.lang.String').$new(i.toString()
+ j.toString()
+ k.toString()
+ t.toString()
+ y.toString())
console.log(newInput)
var result = this.VVVV(listener,newInput)
if(result == true){
console.log('flag is ',newInput)
return result;
}
}
}
}
}
}
}
})
2. 抠代码
第二题
程序分析
function enumerateClassLoader(){
Java.perform(function(){
Java.enumerateClassLoaders({
onMatch: function(loader){
//console.log('classLoader',classLoader.toString());
if(loader.toString().indexOf('dalvik.system.DexClassLoader')>-1){
console.log('find classLoader',loader.toString());
Java.classFactory.loader = loader;
hookVVVV()
return;
}
},onComplete: function(){
console.log('search complete!');
}
})
})
}
function hookVVVV(){
Java.perform(function(){
console.log('loader',Java.classFactory.loader);
for (var i = '0'; i <= '9'; i++) {
for (var j = '0'; j <= '9'; j++) {
for (var k = '0'; k <= '9'; k++) {
for (var t = '0'; t <= '9'; t++) {
for (var y = '0'; y <= '9'; y++) {
var newInput = Java.use('java.lang.String').$new(i.toString()
+ j.toString()
+ k.toString()
+ t.toString()
+ y.toString())
//console.log(newInput)
var result = Java.use('com.kanxue.pediy1.VVVVV').VVVV(newInput)
if(result == true){
console.log('flag is ',newInput)
return;
}
}
}
}
}
}
})
}
setImmediate(enumerateClassLoader)
第三题
写在前面
程序分析
接下来就简单了,跟踪到init函数:
void __fastcall __noreturn detect_frida_loop(void *a1)
{
v9 = a1;
v14 = &v6;
v13 = 16LL;
v12 = 0;
v11 = 16LL;
v10 = 16LL;
v15 = __memset_chk(&v6, 0LL, 16LL, 16LL);
v6 = 2;
inet_aton("0.0.0.0", &v8);
while ( 1 )
{
for ( i = 1; i <= 65533; ++i )
{
v5 = socket(2LL, 1LL, 0LL);
v7 = bswap32(i) >> 16;
if ( connect(v5, &v6, 16LL) != -1 )
{
v20 = &v2;
v19 = 7LL;
v18 = 0;
v17 = 7LL;
v16 = 7LL;
v21 = __memset_chk(&v2, 0LL, 7LL, 7LL);
v26 = v5;
v25 = &unk_14A2;
v24 = -1LL;
v23 = 1LL;
v22 = 0;
v33 = v5;
v32 = &unk_14A2;
v31 = -1LL;
v30 = 1LL;
v29 = 0;
v28 = 0LL;
v27 = 0;
sendto(v5, &unk_14A2, 1LL, 0LL, 0LL, 0LL);
v38 = v5;
v37 = "AUTH\r\n";
v36 = -1LL;
v35 = 6LL;
v34 = 0;
v45 = v5;
v44 = "AUTH\r\n";
v43 = -1LL;
v42 = 6LL;
v41 = 0;
v40 = 0LL;
v39 = 0;
sendto(v5, "AUTH\r\n", 6LL, 0LL, 0LL, 0LL);
usleep(500LL);
v50 = v5;
v49 = &v2;
v48 = 7LL;
v47 = 6LL;
v46 = 64;
v57 = v5;
v56 = &v2;
v55 = 7LL;
v54 = 6LL;
v53 = 64;
v52 = 0LL;
v51 = 0LL;
v3 = recvfrom(v5, &v2, 6LL, 64LL, 0LL, 0LL);
if ( v3 != -1 )
{
if ( strcmp(&v2, "REJECT") )
{
__android_log_print(4LL, "pediy", "not FOUND FRIDA SERVER");
}
else
{
v1 = getpid();
kill(v1, 9LL);
}
}
}
close(v5);
}
}
}
1. 二次打包
2. frida去hookpthread_create函数
这里就不赘述了,直接几乎照抄的r0ysue大佬星球里的,链接见https://wx.zsxq.com/dweb2/login,这里也贴上我抄的代码吧(这里其实还有很多种其他更简单的方法,比如hook strcmp函数等等,我这里的代码还有很多的改进之处,仅供参考)。
function hook_pthread_create(){
var pt_create_func = Module.findExportByName(null,'pthread_create');
var detect_frida_loop_addr = null;
console.log('pt_create_func:',pt_create_func);
Interceptor.attach(pt_create_func,{
onEnter:function(){
if(detect_frida_loop_addr == null)
{
var base_addr = Module.getBaseAddress('libnative-lib.so');
if(base_addr != null){
detect_frida_loop_addr = base_addr.add(0xe9c)
console.log('this.context.x2: ', detect_frida_loop_addr , this.context.x2);
if(this.context.x2.compare(detect_frida_loop_addr) == 0) {
hook_anti_frida_replace(this.context.x2);
}
}
}
},
onLeave : function(retval){
// console.log('retval',retval);
}
})
}
function hook_anti_frida_replace(addr){
console.log('replace anti_addr :',addr);
Interceptor.replace(addr,new NativeCallback(function(a1){
console.log('replace success');
return;
},'pointer',[]));
}
3. 硬编码so
写在最后
看雪ID:小白abc
https://bbs.pediy.com/user-715334.htm
*本文由看雪论坛 小白abc 原创,转载请注明来自看雪社区。
活动专区
在本文下方留言,
留言点赞第一名 可以获得 看雪论坛 转正邀请码一个(价值1000雪币)。
使用邀请码后,可使临时会员转正成功,升级至正式会员!
推荐文章++++
好书推荐